//宝石与石头
/* 给你一个字符串 jewels 代表石头中宝石的类型，另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型，你想知道你拥有的石头中有多少是宝石。

字母区分大小写，因此 "a" 和 "A" 是不同类型的石头。
*/
class Solution {
public:
    int numJewelsInStones(string jewels, string stones) {
        bool hash[128] = {0};
        for (auto& c : jewels) {
            hash[c] = true;
        }
        int count = 0;
        for (auto& c : stones) {
            if (hash[c])
                count++;
        }
        return count;
    }
};
//键盘行
/*给你一个字符串数组 words ，只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

请注意，字符串 不区分大小写，相同字母的大小写形式都被视为在同一行。

美式键盘 中：

第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。
*/
class Solution {

public:
    vector<string> findWords(vector<string>& words) {
        vector<string> ret;
        string a1 = "qwertyuiop";
        unordered_set<char> hash1(a1.begin(), a1.end());
        string a2 = "asdfghjkl";
        unordered_set<char> hash2(a2.begin(), a2.end());
        string a3 = "zxcvbnm";
        unordered_set<char> hash3(a3.begin(), a3.end());
        for (auto& s : words) {
            for (int i = 0; i < s.size(); i++) {
                if (hash1.count(s[i]) || hash1.count(s[i] + 32)) {
                    while (hash1.count(s[i]) || hash1.count(s[i] + 32)) {
                        i++;
                    }
                } else if (hash2.count(s[i]) || hash2.count(s[i] + 32)) {
                    while (hash2.count(s[i]) || hash2.count(s[i] + 32)) {
                        i++;
                    }
                } else if (hash3.count(s[i]) || hash3.count(s[i] + 32)) {
                    while (hash3.count(s[i]) || hash3.count(s[i] + 32)) {
                        i++;
                    }
                }
                if (i != s.size())
                    break;
                ret.push_back(s);
            }
        }
        return ret;
    }
};